﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Kontrolki;
using KPWeb.Class;
using KPWeb.Data;
using KPWeb.Function;
using KPWeb.Reports;
using MSExcel = Microsoft.Office.Interop.Excel;
//using Microsoft.Reporting.WebForms;


namespace KPWeb.KadryPlace
{

    public partial class WniosekUrlopowyTworzZaPracownika : KPPage
    {
        private void komunikatError(int kod)//, int iT, int iID)
        {
            fError.Visible = true;
            switch (kod)
            {
                case -1: Error1.Visible = true;
                    break;
                case -2: Error2.Visible = true;
                    break;
                case -3: Error3.Visible = true;
                            break;
                case -4: Error4.Visible = true;
                    break;
                case -5: Error5.Visible = true;
                    break;
                case -6: Error6.Visible = true;
                    break;
                default: fError.Visible = false;
                    break;
            }
        }
        private void initJednostki(int firmaID, string czyAktywna, string CzyNazwa, string CzyGlowne)
        {
            dJednostkiAktywne.Items.Clear();
            dJednostkiAktywne.Items.Add(new ListItem() { Text = Stale.wybierzJednostke, Value = Stale.wybierzJednostke });
            foreach (KP_JednostkiFirmy item in cJednostki.PobierzJednostki(firmaID, czyAktywna, CzyGlowne))
            {
                dJednostkiAktywne.Items.Add(new ListItem()
                {
                    Text = item.JednostkaKod + (CzyNazwa == "t" ? " - " + item.JednostkaNazwa : ""),
                    Value = item.JednostkaID.ToString()
                });
            }
            dJednostkiAktywne.SelectedIndex = 0;
        }
        private void initOsoby(int jednostkaID)
        {
            dOsobyJednostkaZastepstwo.Items.Clear();
            dOsobyJednostkaZastepstwo.Items.Add(new ListItem() { Text = Stale.wybierzZastepce, Value = "0" });

            dOsobyJednostka.Items.Clear();
            dOsobyJednostka.Items.Add(new ListItem() { Text = Stale.wybierzOsobe, Value = "0" });
            Model model = new Model();
            foreach (vKP_OsobyListaObecnosci item in model.GetListaObecnosci(int.Parse(dJednostkiAktywne.SelectedValue)))
            {
                dOsobyJednostka.Items.Add(new ListItem()
                { Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie), Value = item.OsobaID.ToString() });
                dOsobyJednostkaZastepstwo.Items.Add(new ListItem()
                  { Text = FunctionGlobal.UppercaseFirstWords(item.NazwiskoImie), Value = item.OsobaID.ToString() });
            }
            dOsobyJednostka.SelectedIndex = 0;
        }

        public static vKP_DokumentyWnioskiUrlopowe[] GetWnioskiUrlopowe( int osobaID)
        {
            using (DBContainer db = new DBContainer())
            {

                return (from wiz in db.vKP_DokumentyWnioskiUrlopowe.Where(a => a.OsobaID == osobaID).OrderByDescending(a=>a.OdData)
                        select wiz).ToArray();
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            fError.Visible = false;
            Error1.Visible = false;
            Error2.Visible = false;
            Error3.Visible = false;
            Error4.Visible = false;
            Error5.Visible = false;
            Error6.Visible = false;

         
            if (!IsPostBack)
            {
                initJednostki(int.Parse(Current.FirmaID), "t", "f", "t");

                this.CalendarUC1.AllowHolidaysChecking = true;
                this.CalendarUC1.DateStart = DateTime.Now.Date;
      
                List<DateTime> l = new List<DateTime>();
                foreach (var item in Kalendarz.GetSwieta(DateTime.Now.Date.Year))
                {
                    l.Add(new DateTime(item.year, item.month, item.day));
                }
                this.CalendarUC1.Holidays = l.ToArray();
                dTypUrlopu.Items.Clear();
                foreach (vLex_TypNieobecnosciUrlopu u in UrlopyK.GetListaTypUrlopu().OrderBy(a => a.TypNieobecnosciUrlopuNazwa))
                {
                    this.dTypUrlopu.Items.Add(new ListItem() { Text = u.TypNieobecnosciUrlopuNazwa, Value = u.TypNieobecnosciUrlopuID.ToString() });
                }
                dTypUrlopu.SelectedValue = Stale.urlopInic;
                CalendarUC1.ClearSelected();
            }
            else
            {
              this.CalendarUC1.RenderCalendar();
               tZaznaczone.Text = "";
               tRobocze.Text = "";
            }
          
         }


        protected int WniosekUrlopowWyswietlExcel()
            // 0 OK, 1 brak ciagłości okresu, 2 błąd wyboru typu urlopu
        {
            if (CalendarUC1.Selected.Count() == 0) return -3;
           
            DateTime[] dMinMax = Kalendarz.GetMinMaxOkresu(CalendarUC1.Selected);
            if (!sprawdzCiagloscOkresu(dMinMax[0], dMinMax[1])) return -1;
          
            MSExcel.Application excelApp = new MSExcel.Application();
            string filePath = Server.MapPath("~/EXCEL/SzWniosekUrlopowy.xls");


            MSExcel.Workbook excelWorkbook = excelApp.Workbooks.Open(filePath,
                    0, true, 5, "", "", false, MSExcel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

            MSExcel.Sheets excelSheets = excelWorkbook.Worksheets;

            string currentSheet = "WniosekUrlopowy";
            MSExcel.Worksheet excelWorksheet = (MSExcel.Worksheet)excelSheets.get_Item(currentSheet);
          
            //nazwisko,imie
            MSExcel.Range excelCell = (MSExcel.Range)excelWorksheet.get_Range("B7", "B7");
            excelCell.Value = "Nazwisko imię";
            //jednostka
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("B9", "B9");
            excelCell.Value = "Dział Informatyki";
            //Stanowisko
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("B11", "B11");
            excelCell.Value = "Stanowisko";
            //dnia
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("K7", "K7");
            excelCell.Value = String.Format("{0:yyyy-MM-dd}", DateTime.Now);
            //Od
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("E28", "E28");
            excelCell.Value = dMinMax[0].ToShortDateString();
            //Do
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("H28", "H28");
            excelCell.Value =  dMinMax[1].ToShortDateString();
            //Liczba dni
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("K28", "K28");
            excelCell.Value = tRobocze.Text;
            //Zastepstwo
            excelCell = (MSExcel.Range)excelWorksheet.get_Range("E31", "E31");
            excelCell.Value = dOsobyJednostkaZastepstwo.SelectedValue;

            switch(dTypUrlopu.SelectedValue)
            {
              case  "wypoczynkowy":
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("C22", "C22");
                    excelCell.Value = "X";
                    break;
              case  "wypoczynkowy na żądanie": 
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("F22", "F22");
                    excelCell.Value = "X";
                    break;
              case  "szkoleniowy": 
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("I22", "I22");
                    excelCell.Value = "X";
                    break;
                case  "bezpłatny": 
                     excelCell = (MSExcel.Range)excelWorksheet.get_Range("C25", "C25");
                    excelCell.Value = "X";
                    break;
                case  "okolicznościowy": 
                    excelCell = (MSExcel.Range)excelWorksheet.get_Range("F25", "F25");
                    excelCell.Value = "X";
                    break;
                case  "z tytułu opieki nad dzieckiem":  excelCell = (MSExcel.Range)excelWorksheet.get_Range("I25", "I25");
                    excelCell.Value = "X";
                    break;
                   
              default: return -2;
        }

            excelApp.Visible = true;
            return 0;
        }

        protected int WniosekUrlopowUtworz(byte rodzaj)
        // 0 OK, 1 brak ciagłości okresu, 2 błą wyboru typu urlopu, 6 osoba=zastepca
        {
            if (CalendarUC1.Selected.Count() == 0) return -3;

            if (dOsobyJednostkaZastepstwo.SelectedValue == dOsobyJednostka.SelectedValue) return -6;
           
            int iDni = CalendarUC1.Selected.Count();
            tZaznaczone.Text = iDni.ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();

            DateTime[] dMinMax = Kalendarz.GetMinMaxOkresu(CalendarUC1.Selected);
            int? iTemp = int.Parse(dOsobyJednostkaZastepstwo.SelectedValue);
            iTemp = (iTemp == 0 ? null : iTemp);
            if (!sprawdzCiagloscOkresu(dMinMax[0], dMinMax[1])) return -1;

            int iT = UrlopyK.InsertWniosekUrlopowy(int.Parse(hOsobaID.Value), byte.Parse(dTypUrlopu.SelectedValue),
                 iTemp,  dMinMax[0], dMinMax[1], int.Parse(tRobocze.Text),rodzaj,2);








            //{
            //    byte iT = byte.Parse(((Label)((Button)sender).Parent.FindControl("typDokumentuID")).Text);
            //    int iID = int.Parse(((Label)((Button)sender).Parent.FindControl("dokumentID")).Text);
            //    int iTemp = WstawDokument(iT, iID, int.Parse(Current.UprawnieniaFunkcjaID), DateTime.Now, 0);
            //    if (iTemp > 0)
            //    {
            //        this.ListView1.DataBind();
            //        this.ListView2.DataBind();
            //    }
            //    else
            //        komunikaError(iTemp, iT, iID);
            //}




            return iT; //Ostatni wiersz w procedurze
        }


        protected void ZarejestrujWniosekUrlopowy_Click(object sender, System.EventArgs e)
        {
            //2 papierowy
            int iTemp = WniosekUrlopowUtworz(2);

            if (iTemp < 0) komunikatError(iTemp); //Ostatni wiersz w procedurze
        }
    
        protected void urlopRLBOryginal_Click(object sender, System.EventArgs e)
        {

            string sTemp = ((KPWeb.Kontrolki.RaportLinkButton)sender).CommandArgument.ToString();

            for (int i = sTemp.Length; i < Stale.countDigitsInBarCode - 2; i++)
            {
                sTemp = "0" + sTemp;
            }

            sTemp = Stale.idWU + sTemp;

            RaportyPDF.RaportWniosekUrlopowyBarCodePDF(int.Parse(sTemp),1);
      }

        protected void CalendarUC_UserControlRefreshedE(object sender, CalendarUC.ActionEvent e)
        {
            //tutaj odswiez u siebie dni
            if (sender == null) return;
            int iDni = (sender as CalendarUC).Selected.Count();
            tZaznaczone.Text = iDni.ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych((sender as CalendarUC).Selected).ToString();

            if (e.ActionType == CalendarUC.ActionType.NextPrevMonth || e.ActionType == CalendarUC.ActionType.PageLoad)
            {
                this.CalendarUC1.ClearUnavailablePeriods();
                DateTime since = new DateTime((sender as CalendarUC).DateStart.Year, (sender as CalendarUC).DateStart.Month, 1);
                DateTime until = new DateTime(since.Year, since.Month, DateTime.DaysInMonth(since.Year, since.Month));

                DateTime zatrOd = DateTime.Parse(Current.DataZatrudnieniaOd);
                DateTime zatrDo = DateTime.Parse(Current.DataZatrudnieniaDo);

                if (zatrOd > since && zatrOd > until || zatrDo < since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(since, until);
                else
                    if (zatrOd > since && zatrOd < until) (sender as CalendarUC).AddUnavailablePeriod(since, zatrOd.AddDays(-1));

                if (zatrDo > since && zatrDo < until) (sender as CalendarUC).AddUnavailablePeriod(zatrDo.AddDays(1), until);
            }
        }
        protected void bDaty_Click(object sender, EventArgs e)
        {
           zaznaczDniCalendar(DateTime.Parse(tDataOd.Text), DateTime.Parse(tDataDo.Text));
        }

        protected void tData_Click(object sender, EventArgs e)
        {
            DateTime dd1;
            DateTime dd2;
            CalendarUC1.ClearSelected();
            if (DateTime.TryParse(tDataOd.Text,out dd1) && DateTime.TryParse(tDataDo.Text,out dd2))
                                                 zaznaczDniCalendar(dd1, dd2);
        }
    
        protected bool sprawdzCiagloscOkresu(DateTime d1, DateTime d2)
        {
           for (DateTime d = d1; d <= d2; d = d.AddDays(1))
            {
                if (CalendarUC1.Selected.Where(a => a.Date == d).Count() == 0) return false;
            }
           return true;
        }
        protected void zaznaczDniCalendar(DateTime d1, DateTime d2)
        {
            CalendarUC1.ClearSelected();
     
            List<DateTime> l = new List<DateTime>();
            for (DateTime d = d1; d <= d2; d = d.AddDays(1))
            {
                l.Add(new DateTime(d.Year, d.Month, d.Day));
            }
            CalendarUC1.Selected = l.ToArray();


     //       ViewState["Dates"] = CalendarUC1.Selected;


            tZaznaczone.Text = CalendarUC1.Selected.Count().ToString();
            tRobocze.Text = Kalendarz.GetLiczbaDniRoboczych(CalendarUC1.Selected).ToString();
        
        }
       
  protected void btnKasujClick(object sender, EventArgs e)
        {
         
            int outProc =  UrlopyK.DeleteWniosekUrlopowy(
                           int.Parse(((Button)sender).CommandArgument.ToString()));
            if (outProc != 0) Error2.Visible = true;
            this.ListView1.DataBind();
        
        }

  protected void btnDoKadrClick(object sender, EventArgs e)
  {
     
      int outProc = UrlopyK.UpdateWniosekUrlopowy(
                     int.Parse(((Button)sender).CommandArgument.ToString()),0,1);
      if (outProc != 0) Error2.Visible = true;
      this.ListView1.DataBind();
 
  }

  protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
  {
      string sTemp = ((Label)e.Item.FindControl("Zastepstwo")).Text;

      ((Label)e.Item.FindControl("Zastepstwo")).Text = FunctionGlobal.UppercaseFirstWords(sTemp);
  }
  protected void LinkButton1_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Zestawienia/ToDo1.aspx");
  }

  protected void lKartaPracy_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Zestawienia/ToDo1.aspx");
  }
  protected void lInfo_Click(object sender, EventArgs e)
  {

      Osoby osoba1 = new Osoby();
      vKP_Osoby tempOsoba = osoba1.GetDaneOsoby(int.Parse(dJednostkiAktywne.SelectedValue), int.Parse(dOsobyJednostka.SelectedValue));
      if (tempOsoba == null)
      {
          lNieobecna.Text = "Brak danych osoby w bazie";
          return;
      }
      string nazwisko = HttpUtility.UrlEncode(tempOsoba.Nazwisko.ToString());
      string imie = HttpUtility.UrlEncode(tempOsoba.Imie.ToString());
      System.Diagnostics.Process.Start(
          "http://pracownicy.wum.edu.pl/PeopleSearch/Default.aspx?TabKey=0&TaskItemKey=2&Screen=1&SummaryFilter=(%26(givenName%3d" +
          imie + "*)(sn%3d" + nazwisko + "*))");
  }
  protected void lSzukaj_Click(object sender, EventArgs e)
  {
      lObecna.Text = "W dniu dzisiejszym wybrana osoba jest w pracy";
      DateTime dNow = DateTime.Now;


  }

  protected void lZastepca_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Zestawienia/ToDo1.aspx");
  }
  protected void lPlanyUrlopow_Click(object sender, EventArgs e)
  {
      Server.Transfer("~/Urlopy/PlanyUrlopow.aspx?value=0&osobaIDPlany=" + int.Parse(hOsobaID.Value)
       + "&osobaJednostkaIDPlany=" + int.Parse(dJednostkiAktywne.SelectedValue));
  }
  protected void dJednostkiAktywne_SelectedIndexChanged(object sender, EventArgs e)
  {
      if ((sender as DropDownList).SelectedIndex != 0)
      {
          this.dOsobyJednostka.Enabled = true;
          initOsoby((sender as DropDownList).SelectedIndex);
      }
      else
      {
          this.dOsobyJednostka.Enabled = false;
      }
  }

  protected void dOsobyJednostka_SelectedIndexChanged(object sender, EventArgs e)
  {
      hOsobaID.Value = dOsobyJednostka.SelectedValue.ToString();
      if ((sender as DropDownList).SelectedIndex != 0)
      {
          this.lSzukaj.Enabled = true;
          lPlanyUrlopow.Enabled = true;
          lInfo.Enabled = true;
          fWniosekUrlopowy.Visible = true;
          fListaWnioskowUrlopowych.Visible = true;
         
          //     initOsoby((sender as DropDownList).SelectedIndex);
      }
      else
      {
          this.lSzukaj.Enabled = false;
          lPlanyUrlopow.Enabled = false;
          lInfo.Enabled = false;
          fWniosekUrlopowy.Visible = false;
          fListaWnioskowUrlopowych.Visible = false;
      }
  }
  //protected void lKartaPracy_Click(object sender, EventArgs e)
  //{
  //    Server.Transfer("~/Zestawienia/ToDo1.aspx");
  //}
  //protected void lInfo_Click(object sender, EventArgs e)
  //{

  //    Osoby osoba1 = new Osoby();
  //    vKP_Osoby tempOsoba = osoba1.GetDaneOsoby(int.Parse(dJednostkiAktywne.SelectedValue), int.Parse(dOsobyJednostka.SelectedValue));
  //    if (tempOsoba == null)
  //    {
  //        lNieobecna.Text = "Brak danych osoby w bazie";
  //        return;
  //    }
  //    string nazwisko = HttpUtility.UrlEncode(tempOsoba.Nazwisko.ToString());
  //    string imie = HttpUtility.UrlEncode(tempOsoba.Imie.ToString());
  //    System.Diagnostics.Process.Start(
  //        "http://pracownicy.wum.edu.pl/PeopleSearch/Default.aspx?TabKey=0&TaskItemKey=2&Screen=1&SummaryFilter=(%26(givenName%3d" +
  //        imie + "*)(sn%3d" + nazwisko + "*))");
  //}
  //protected void lSzukaj_Click(object sender, EventArgs e)
  //{
  //    UrlopyK urlop = new UrlopyK();
  //    //vKP_DokumentyWnioskiUrlopowe  item= new vKP_DokumentyWnioskiUrlopowe();
  //    vKP_DokumentyWnioskiUrlopowe item = urlop.GetObecnoscOsobyWnioskiUrlopowe(int.Parse(dOsobyJednostka.SelectedValue), DateTime.Parse(tData.Text));
  //    lObecna.Visible = (item == null);
  //    lNieobecna.Visible = (item != null);
  //    lNieobecnaOkres.Visible = (item != null);
  //    //lZastepca.Visible = (item.ZastepstwoOsobaID != null);
  //    //lBrakZastepcy.Visible = (item.ZastepstwoOsobaID == null);
  //    if (item == null)
  //    {
  //        lObecna.Text = "W wybranym dniu osoba jest w pracy";
  //        lBrakZastepcy.Visible = false;
  //        lZastepca.Visible = false;
  //    }
  //    else
  //    {
  //        lNieobecna.Text = "W wybranym dniu nie ma osoby w pracy.";
  //        lNieobecnaOkres.Text = " Nieobecność: "
  //            + String.Format("{0:yyyy-MM-dd}", item.OdData) + " do " +
  //             String.Format("{0:yyyy-MM-dd}", item.DoData);
  //        lBrakZastepcy.Visible = true;
  //        if (item.ZastepstwoOsobaID != null)
  //        {
  //            lZastepca.Visible = true;
  //            lBrakZastepcy.Text = "Zastępstwo";
  //            lZastepca.Text = FunctionGlobal.UppercaseFirstWords(item.Zastepstwo);
  //        }
  //        else
  //        {
  //            lZastepca.Visible = false;
  //            lBrakZastepcy.Text = "Brak zastępstwa";
  //        }
  //    }


  //}

  //protected void lZastepca_Click(object sender, EventArgs e)
  //{
  //    //  Server.Transfer("~/Zestawienia/ToDo1.aspx");

  //    UrlopyK urlop = new UrlopyK();
  //    vKP_DokumentyWnioskiUrlopowe item = urlop.GetObecnoscOsobyWnioskiUrlopowe(int.Parse(dOsobyJednostka.SelectedValue), DateTime.Now);

  //    Osoby osoba1 = new Osoby();
  //    vKP_Osoby tempOsoba = osoba1.GetDaneOsoby(int.Parse(dJednostkiAktywne.SelectedValue), (int)item.ZastepstwoOsobaID);
  //    if (tempOsoba == null)
  //    {
  //        lNieobecna.Text = "Brak danych osoby w bazie";
  //        return;
  //    }
  //    string nazwisko = HttpUtility.UrlEncode(tempOsoba.Nazwisko.ToString());
  //    string imie = HttpUtility.UrlEncode(tempOsoba.Imie.ToString());
  //    System.Diagnostics.Process.Start(
  //        "http://pracownicy.wum.edu.pl/PeopleSearch/Default.aspx?TabKey=0&TaskItemKey=2&Screen=1&SummaryFilter=(%26(givenName%3d" +
  //        imie + "*)(sn%3d" + nazwisko + "*))");


  //}
  //protected void lPlanyUrlopow_Click(object sender, EventArgs e)
  //{
  //    Server.Transfer("~/Urlopy/PlanyUrlopow.aspx?value=0&osobaIDPlany=" + int.Parse(dOsobyJednostka.SelectedValue)
  //     + "&osobaJednostkaIDPlany=" + int.Parse(dJednostkiAktywne.SelectedValue));
  //}
  //protected void dJednostkiAktywne_SelectedIndexChanged(object sender, EventArgs e)
  //{
  //    //  initOpisyObecnoscWPracy();
  //    if ((sender as DropDownList).SelectedIndex != 0)
  //    {
  //        this.dOsobyJednostka.Enabled = true;
  //        initOsoby((sender as DropDownList).SelectedIndex);
  //    }
  //    else
  //    {
  //        this.dOsobyJednostka.Enabled = false;
  //        //    this.dOsobyJednostka.SelectedIndex = 0;
  //    }
  //}

  //protected void dOsobyJednostka_SelectedIndexChanged(object sender, EventArgs e)
  //{
  //    //  initOpisyObecnoscWPracy();
  //    if ((sender as DropDownList).SelectedIndex != 0)
  //    {
  //        this.lSzukaj.Enabled = true;
  //        lPlanyUrlopow.Enabled = true;
  //        lInfo.Enabled = true;
  //        //     initOsoby((sender as DropDownList).SelectedIndex);
  //    }
  //    else
  //    {
  //        this.lSzukaj.Enabled = false;
  //        lPlanyUrlopow.Enabled = false;
  //        lInfo.Enabled = false;
  //    }
  //}

    }
}